package cn.demoncat.util.lang;

import org.apache.commons.lang3.StringUtils;

/**
 * Unicode 编码工具
 *
 * @author 延晓磊
 * @since 2019年2月19日
 */
public class UnicodeUtil {

    /**
     * 字符串转换Unicode
     *
     * @param string
     * @return Unicode
     *
     * @author 延晓磊
     *
     * @since 2019年2月19日
     */
    public static String toUnicode(String string) {
        if (StringUtils.isBlank(string)) {
            return string;
        }
        StringBuilder unicode = new StringBuilder(string.length() * 6);
        char c;
        for (int i = 0; i < string.length(); i++) {
            // 取出每一个字符
            c = string.charAt(i);
            // 转换为unicode：将字符转换为16进制，再前缀"\\u"
            unicode.append("\\u").append(Integer.toHexString(c));
        }
        return unicode.toString();
    }

    /**
     * Unicode 转字符串
     *
     * @param unicode   支持局部Unicode
     * @return String
     *
     * @author 延晓磊
     *
     * @since 2019年2月19日
     */
    public static String parseUnicode(String unicode) {
        if (StringUtils.isBlank(unicode)) {
            return unicode;
        }
        final int len = unicode.length();
        StringBuilder string = new StringBuilder(len);
        int i;
        int pos = 0;
        char c;
        while ((i = StringUtils.indexOfIgnoreCase(unicode, "\\u", pos)) != -1) {
            // 写入Unicode符之前的部分
            string.append(unicode, pos, i);
            pos = i;
            if (i + 5 < len) {
                try {
                    c = (char) Integer.parseInt(unicode.substring(i + 2, i + 6), 16);
                    string.append(c);
                    // 跳过Unicode符
                    pos = i + 6;
                } catch (NumberFormatException e) {
                    // 非Unicode符，将"\\u"作为字符写入
                    string.append(unicode, pos, i + 2);
                    pos = i + 2;
                }
            } else {
                // 非Unicode符，结束
                break;
            }
        }
        if (pos < len) {
            // 末尾的非Unicode符
            string.append(unicode, pos, len);
        }
        return string.toString();
    }

}
